//package com.inspur.edp.bff.rtgenerator.generators.managergenerator.mgrImplclass.methodgenerators;
//
//import com.inspur.edp.bff.api.attribute.VMDataExtendAttribute;
//import com.inspur.edp.bff.api.attribute.VMRootAttribute;
//import com.inspur.edp.bff.rtgenerator.generators.managergenerator.mgrImplclass.FSMgrImplGenContext;
//import com.inspur.edp.bff.spi.IHelpExtend;
//import com.inspur.edp.bff.spi.IHelpMapping;
//import com.inspur.edp.bff.spi.VMHelpConfig;
//import com.inspur.edp.bff.spi.utils.ReflectInfo;
//import com.inspur.edp.caf.generator.baseInfo.ParameterInfo;
//import com.inspur.edp.caf.generator.baseInfo.TypeInfo;
//import com.inspur.edp.caf.generator.method.ClassMethodGenerator;
//import com.inspur.edp.caf.generator.utils.ExpressionUtils;
//import com.inspur.edp.cef.gencommon.ReflectionUtils;
//import lombok.var;
//import org.eclipse.jdt.core.dom.*;
//
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.HashMap;
//import java.util.Map;
//
//public class GetHelpActionGenerator extends ClassMethodGenerator {
//    private FSMgrImplGenContext fsMgrImplGenContext;
//    private static final String ParamLabelId = "labelId";
//    private static final String ParamCodeName = "codeName";
//
//    public GetHelpActionGenerator(FSMgrImplGenContext fsMgrImplGenContext) {
//        this.fsMgrImplGenContext = fsMgrImplGenContext;
//    }
//
//    @Override
//    protected Block buildMethodBody() {
//        Class implType = fsMgrImplGenContext.getFSGenContext().getMgrInterfaceAndType().get(0).getImplType();
//
//        VMDataExtendAttribute attr = (VMDataExtendAttribute) implType.getAnnotation(VMDataExtendAttribute.class);
//
//        Class entityType = attr.entityDataType();
//        VMRootAttribute rootAttribute = (VMRootAttribute) entityType.getAnnotation(VMRootAttribute.class);
//        Class recordType = rootAttribute.mappingType();
//        if (recordType == null) {
//            return getDefautlReturnBlock();
//        }
//        Object tempVar = ReflectionUtils.createInstance(recordType);
//
//        IHelpMapping record = (IHelpMapping) ((tempVar instanceof IHelpMapping) ? tempVar : null);
//
//        HashMap<String, VMHelpConfig> configs = record.getHelpConfig();
//        if (configs == null) {
//            return getDefautlReturnBlock();
//        }
//        HashMap<String, ArrayList<ReflectInfo>> actionCollection = new HashMap<String, ArrayList<ReflectInfo>>();
//
//        for (Map.Entry<String, VMHelpConfig> config : configs.entrySet()) {
//            actionCollection.put(config.getKey(), config.getValue().getActionRecord());
//        }
//        SwitchStatement statement = getSwitchExpress(actionCollection);
//        Block block = ast.newBlock();
//        block.statements().add(statement);
//        return block;
//
//    }
//
//    private Block getDefautlReturnBlock() {
//        var block = ast.newBlock();
//        block.statements().add(getDefaultReturnStatement());
//        return block;
//    }
//
//    private Statement getDefaultReturnStatement()
//    {
//        var returnStatement = ast.newReturnStatement();
//        var creation = ast.newClassInstanceCreation();
//        creation.setType(getReturnType().getType(ast, fsMgrImplGenContext.getFSGenContext().getRootCompileUnitGenCtx()));
//        returnStatement.setExpression(creation);
//        return returnStatement;
//    }
//    @Override
//    protected ArrayList<Modifier.ModifierKeyword> getAccessModifiers() {
//        return new ArrayList<Modifier.ModifierKeyword>(Arrays.asList(
//                new Modifier.ModifierKeyword[]{Modifier.ModifierKeyword.PROTECTED_KEYWORD}));
//    }
//
//    @Override
//    protected boolean getIsOverride() {
//        return true;
//    }
//
//    @Override
//    protected String getMethodName() {
//        return "getHelpActions";
//    }
//
//    @Override
//    protected ArrayList<ParameterInfo> getParameterCollection() {
//        ParameterInfo tempVar = new ParameterInfo();
//        tempVar.setParamType(new TypeInfo(String.class));
//        tempVar.setParamName(ParamCodeName);
//        ParameterInfo tempVar2 = new ParameterInfo();
//        tempVar2.setParamType(new TypeInfo(String.class));
//        tempVar2.setParamName(ParamLabelId);
//        return new ArrayList<ParameterInfo>(Arrays.asList(new ParameterInfo[]{tempVar, tempVar2}));
//    }
//
//    @Override
//    protected TypeInfo getReturnType() {
//        TypeInfo typeInfo = new TypeInfo(ArrayList.class);
//        typeInfo.setIsParameterizedType(true);
//        TypeInfo paramType = new TypeInfo(IHelpExtend.class);
//        typeInfo.getArguments().add(paramType);
//        return typeInfo;
//    }
//
//    private SwitchStatement getSwitchExpress(HashMap<String, ArrayList<ReflectInfo>> dic) {
//
//        SwitchStatement switchStatement = ast.newSwitchStatement();
//        InfixExpression infixExpression = ast.newInfixExpression();
//        infixExpression.setLeftOperand(ast.newSimpleName(ParamCodeName));
//        infixExpression.setOperator(InfixExpression.Operator.PLUS);
//        infixExpression.setRightOperand(ast.newSimpleName(ParamLabelId));
//        switchStatement.setExpression(infixExpression);
//
//        for (String key : dic.keySet()) {
//
//            SwitchCase caseStatement = ast.newSwitchCase();
//            caseStatement.setExpression(ExpressionUtils.getStringLiteral(ast, key));
//            switchStatement.statements().add(caseStatement);
//
//            Type returnType = getReturnType().getType(ast, fsMgrImplGenContext.getFSGenContext().getRootCompileUnitGenCtx());
//            ClassInstanceCreation listCreation = ast.newClassInstanceCreation();
//            listCreation.setType(returnType);
//            VariableDeclarationFragment frag = ast.newVariableDeclarationFragment();
//            frag.setInitializer(listCreation);
//            String varName = (key + "List").replaceAll("-","").replaceAll("_","");
//            try{
//                frag.setName(ast.newSimpleName(varName));
//            }catch (Exception e){
//                throw new RuntimeException("帮助事件名为:"+key);
//            }
//
//            VariableDeclarationStatement creationStatement = ast.newVariableDeclarationStatement(frag);
//            creationStatement.setType(getReturnType().getType(ast, fsMgrImplGenContext.getFSGenContext().getRootCompileUnitGenCtx()));
//            switchStatement.statements().add(creationStatement);
//
//            ArrayList<Statement> initStatements =  getListExpress(dic.get(key),varName);
//            if(initStatements.size()>0)
//                switchStatement.statements().addAll(initStatements);
//
//
//            ReturnStatement returnStatement = ast.newReturnStatement();
//            returnStatement.setExpression(ast.newSimpleName(varName));
//            switchStatement.statements().add(returnStatement);
//
//        }
//
//        SwitchCase defaultCase =ast.newSwitchCase();
//        defaultCase.setExpression(null);
//        switchStatement.statements().add(defaultCase);
//        switchStatement.statements().add(getDefaultReturnStatement());
//
//        return switchStatement;
//    }
//
//    private ArrayList<Statement> getListExpress(ArrayList<ReflectInfo> list, String varName) {
//
//        ArrayList<Statement> statements = new ArrayList<Statement>();
//        for (ReflectInfo info : list) {
//            MethodInvocation invocation = ExpressionUtils.getMethodInvocation(ast, varName, "add");
//
//            CastExpression castExpression = ast.newCastExpression();
//            castExpression.setType(new TypeInfo(IHelpExtend.class).getType(ast
//                    , fsMgrImplGenContext.getFSGenContext().getRootCompileUnitGenCtx()));
//            MethodInvocation castInvocation = ast.newMethodInvocation();
//            castInvocation.setName(ast.newSimpleName("createInstance"));
//            castInvocation.arguments().add(ExpressionUtils.getStringLiteral(ast,info.getClassName()));
//            castExpression.setExpression(castInvocation);
//
//            invocation.arguments().add(castExpression);
//
//            statements.add(ast.newExpressionStatement(invocation));
//        }
//        return statements;
//    }
//
//}